package io.jnet.common.api;

import java.nio.channels.AsynchronousSocketChannel;
import io.jnet.common.bufstorage.BufStorage;
import io.jnet.common.streamprocessor.StreamProcessor;

public interface ChannelContext
{
    public BufStorage bufStorage();
    
    public void registerRead();
    
    public void registerWrite();
    
    /**
     * 推送一个数据到通道中准备发送
     * 
     * @param send
     * @param index
     * @throws Throwable
     */
    public void push(Object send, int index) throws Throwable;
    
    /**
     * 注意，方法的内部实现保证close方法实际上只会被调用一次。返回true意味着真正的调用了close方法。返回false，就意味着有别人已经调用了close方法
     */
    public boolean close();
    
    /**
     * 从通道接收到数据后，进行对应处理的处理器
     * 
     * @return
     */
    public StreamProcessor[] processors();;
    
    public AsynchronousSocketChannel socketChannel();
    
    public boolean isOpen();
}
